package my.myorm.tool.jdbc;

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedList;

/**
 * 查询转换后的记录，ResultSet的每一行对应着一个RecordMap,RecordMap里封装着各个javabean
 *
 * @author Skeven Huang
 * @version 1.0
 */
public class RecordMap {
    private Map<Class, List<Object[]>> data = new HashMap<Class, List<Object[]>>();

    /**
     * 写入指定class的javabean对象
     *
     * @param key
     * @param value
     * @throws Exception
     */
    public void put(Class key, Object value) throws Exception {
        put(key, value, "");
    }

    /**
     * 一个class可能对应着多个javabean对象，这里以表别名做为区别
     *
     * @param key
     * @param value
     * @param tableAlia
     * @throws Exception
     */
    public void put(Class key, Object value, String tableAlia) throws Exception {
        if (!data.containsKey(key)) {
            data.put(key, new LinkedList<Object[]>());
        }
        String valuekey = tableAlia == null ? "" : tableAlia.trim().toLowerCase();
        data.get(key).add(new Object[]{valuekey, value});
    }

    /**
     * 获取指定class的javabean对象，转换成指定类型
     *
     * @param key
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> T get(Class<T> key) throws Exception {
        return get(key, "");
    }

    /**
     * 根据表别名获取指定的javabean对象
     *
     * @param key
     * @param tableAlia
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> T get(Class<T> key, String tableAlia) throws Exception {
        List<Object[]> value = data.get(key);
        if (value == null || value.size() == 0) return null;
        if (value.size() == 1) return (T) value.get(0)[1];
        if (tableAlia == null || tableAlia.trim().equals("")) return null;
        for (int i = 0; i < value.size(); i++) {
            Object[] objs = value.get(i);
            if ((objs[0] + "").equals(tableAlia.trim().toLowerCase())) {
                return (T) objs[1];
            }
        }
        return null;
    }
}
